#include <iostream>
#include <unistd.h>
#include <signal.h>

int cnt = 0;

void PrintBlock()
{
    sigset_t act, oact;
    sigemptyset(&act);
    sigemptyset(&oact);
    sigprocmask(SIG_BLOCK, &act, &oact);

    printf("block: ");
    for (int i = 31; i > 0; i--)
    {
        if (sigismember(&oact, i))
            std::cout << 1;
        else
            std::cout << 0;
    }
    std::cout << std::endl;
}

void PrintPending()
{
    sigset_t pending;
    sigpending(&pending);
    printf("pending: ");
    for (int i = 31; i > 0; i--)
    {
        if (sigismember(&pending, i))
            std::cout << 1;
        else
            std::cout << 0;
    }
    std::cout << std::endl;
}

void handler(int signo)
{
    cnt++;
    while (true)
    {
        // 如果再信号处理期间继续发信号会不会去执行新的信号呢? -> 会四递归吗? -> 不会会自动堵塞正在处理的信号
        std::cout << "i get a signo: " << signo << ", cnt " << cnt << std::endl;
        // PrintBlock(); // 进程会再信号处理的过程中会自动阻塞信号
        PrintPending(); //如果此时pending表全是0，则证明是再信号处理前就把信号置为0了。
        sleep(1);
        break;
    }
    // exit(1);
}

// 那么pending表是再信号处理前就消除的还是信号处理之后呢?
// 如果是信号处理之后那么如何知道是新产生的信号还是老的信号呢? --> 所以是再信号处理前就消除了
int main1()
{
    struct sigaction act, oact;
    act.sa_handler = handler;

    // for (int i = 31; i > 0; i--)
    // {
    //     sigaddset(&act.sa_mask, i); //不会阻塞9和19号信号
    // }
    // sigaddset(&act.sa_mask,4);
    // sigaddset(&act.sa_mask,5);
    // sigaddset(&act.sa_mask,6);
    // sigaddset(&act.sa_mask,7);
    // 信号捕捉操作
    sigaction(2, &act, &oact);

    while (true)
    {
        // PrintBlock();
        PrintPending();
        pause();
    }
    return 0;
}